#include "chatview.h"

#include <QScrollBar>
#include <QStyleOption>
#include <QPainter>
#include <QTimer>
#include <QDebug>

ChatView::ChatView(QWidget *parent) :
    QWidget(parent)
{
    // 外层ChatView是一个widget

    // 添加一个垂直布局
    QVBoxLayout *pMainLayout = new QVBoxLayout();
    this->setLayout(pMainLayout);
    pMainLayout->setMargin(0);

    // 添加一个滚动区域
    _pScrollArea = new QScrollArea();
    _pScrollArea->setObjectName("chat_area");   // 为了使用qss
    pMainLayout->addWidget(_pScrollArea);           // 将滚动区域加到垂直布局中

    // 添加一个widget，当作聊天背景
    QWidget * w = new QWidget(this);
    w->setObjectName("chat_bg");
    w->setAutoFillBackground(true);

    // 再添加一个垂直布局，用作添加消息
    QVBoxLayout * pVLayout_1 = new QVBoxLayout();
    pVLayout_1->addWidget(new QWidget(), 100000);
    w->setLayout(pVLayout_1);                       // 聊天背景设置为垂直布局
    _pScrollArea->setWidget(w);                     // 把聊天背景加到滚动区域中

    // 设置垂直滚动条为只在滚动的时候显示
    _pScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 滚动区域不显示滚动条
    QScrollBar * pVScrollBar = _pScrollArea->verticalScrollBar();     // 获取滚动区域垂直滚动条
    connect(pVScrollBar, &QScrollBar::rangeChanged, this, &ChatView::onVScrollBarMoved); // 当有新条目添加时调用槽函数，垂直滚动条到最下面，

    // 把垂直ScrollBar放到上边而不是原来的并排
    QHBoxLayout * pHLayout_2 = new QHBoxLayout();           // 新建一个水平布局
    pHLayout_2->addWidget(pVScrollBar, 0, Qt::AlignRight);
    pHLayout_2->setMargin(0);
    _pScrollArea->setLayout(pHLayout_2);                    // 滚动区域设置为水平布局（只有一个聊天背景）
    pVScrollBar->setHidden(true);

    _pScrollArea->setWidgetResizable(true);
    _pScrollArea->installEventFilter(this);
    initStyleSheet();
}

ChatView::~ChatView()
{

}

void ChatView::appendChatItem(QWidget *item)
{
//    qDebug() << "将消息添加到布局";
    QVBoxLayout *v1 = qobject_cast<QVBoxLayout *>(_pScrollArea->widget()->layout());
    v1->insertWidget(v1->count() - 1, item);    // 添加到垂直布局的上面
    _isAppended = true;
}

void ChatView::prependChatItem(QWidget *item)
{

}

void ChatView::insertChatItem(QWidget *item)
{

}

void ChatView::removeAllItem()
{
    QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(_pScrollArea->widget()->layout());

    int count = layout->count();

    for (int i = 0; i < count - 1; ++i) {
        QLayoutItem *item = layout->takeAt(0); // 始终从第一个控件开始删除
        if (item) {
            if (QWidget *widget = item->widget()) {
                delete widget;
            }
            delete item;
        }
    }
}

bool ChatView::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::Enter && watched == _pScrollArea) {
        _pScrollArea->verticalScrollBar()->setHidden(_pScrollArea->verticalScrollBar()->maximum() == 0);
    }
    else if (event->type() == QEvent::Leave && watched == _pScrollArea) {
        _pScrollArea->verticalScrollBar()->setHidden(true);
    }
    return QWidget::eventFilter(watched, event);
}

void ChatView::paintEvent(QPaintEvent *event)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    QWidget::paintEvent(event);
}

void ChatView::onVScrollBarMoved(int min, int max)
{
    Q_UNUSED(min);
    Q_UNUSED(max);

    if (_isAppended) { // 添加item可能调用多次
        QScrollBar * pVScrollBar = _pScrollArea->verticalScrollBar();
        pVScrollBar->setSliderPosition(pVScrollBar->maximum());             // 将滚动条滚到最下面
        // 500ms内可能调用多次
        QTimer::singleShot(500, [this](){
           _isAppended = false;
        });
    }
}

void ChatView::initStyleSheet()
{

}
